
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.net.*;
import java.io.*;

public class Logo extends JApplet implements ActionListener {
	
	private JDesktopPane desktop;
	private JInternalFrame JIFedit,JIFexec,JIFconsol;
	private JCheckBoxMenuItem JCBMediteur,JCBMexecution,JCBMconsole;
	private JMenuItem itemNouveau,itemOpen,itemSave,itemSaveAs,itemExit,itemCopy,itemCut,itemPaste,itemInfo,itemVersion;
	private Editeur edit;
	private Execution exec;
	private Console consol;
	private Bibliotheque biblio;
	private String TitreEditeur = "Editeur";
	public Image [] imgToolBar;
	private boolean saved = false;
	
	public void init() {
		JIFedit = new JInternalFrame(TitreEditeur+"- Nouveau fichier",true,false,true,true);
		JIFexec = new JInternalFrame("Execution",true,false,true,true);
		JIFconsol = new JInternalFrame("Console",true,false,true,true);
		
		imgToolBar=new Image[5];
		imgToolBar[0] = getImage(getCodeBase(),"imageToolbar/enregistrer.gif");
		imgToolBar[1] = getImage(getCodeBase(),"imageToolbar/animalTortue.gif");
		imgToolBar[2] = getImage(getCodeBase(),"imageToolbar/hautparleur.gif");
		imgToolBar[3] = getImage(getCodeBase(),"imageToolbar/zoomP.gif");
		imgToolBar[4] = getImage(getCodeBase(),"imageToolbar/zoomM.gif");
		
				
		exec = new Execution();
		consol = new Console();
		biblio = new Bibliotheque(consol,exec);
		edit = new Editeur(JIFedit,biblio);
		this.AddMenu();
		this.AddDesktop();		
		
		//saved=false;
	}
	
	private void AddDesktop(){				
		desktop = new JDesktopPane();								
		
		this.getContentPane().add(desktop, BorderLayout.CENTER);
		desktop.setBackground(Color.LIGHT_GRAY);
		desktop.add(JIFedit, JLayeredPane.DEFAULT_LAYER);
		desktop.add(JIFexec, JLayeredPane.DEFAULT_LAYER);
		desktop.add(JIFconsol, JLayeredPane.DEFAULT_LAYER);		
		
		int HautScreen = (int) this.getSize().getHeight();
		int LargScreen = (int) this.getSize().getWidth();
		
		//on affiche l'editeur
		JIFedit.getContentPane().add(edit);
		JIFedit.setSize(LargScreen/3, HautScreen-25);
		JIFedit.setLocation(1, 1);
		JIFedit.show();
		
		JIFexec.getContentPane().add(exec,"Center");
		JIFexec.setBounds(JIFedit.getWidth()+10,1,LargScreen-JIFedit.getWidth()-10,HautScreen*3/4) ;		
		JIFexec.setVisible(true);
		
		JIFconsol.getContentPane().add(consol,"Center");									
		JIFconsol.setBounds(JIFedit.getWidth()+10,exec.getHeight()+30,LargScreen-JIFedit.getWidth()-10,HautScreen-exec.getHeight()-55);
		JIFconsol.setVisible(true);
	}
	
	private void AddMenu(){
		JMenuBar menuBar = new JMenuBar();
		
		JMenu menuFichier = new JMenu("Ficher");
		JMenu menuEdition = new JMenu("Edition");
		JMenu menuAffichage = new JMenu("Affichage");
		JMenu menuAide = new JMenu("Aide");
		
		itemNouveau = new JMenuItem("Nouveau");	
		itemOpen = new JMenuItem("Ouvrir...");			    
		itemSave = new JMenuItem("Enregistrer");
		itemSaveAs = new JMenuItem("Enregistrer sous...");
		itemExit = new JMenuItem("Fermer");
		itemNouveau.addActionListener(this);
		itemOpen.addActionListener(this);
		itemSave.addActionListener(this);		
		itemSaveAs.addActionListener(this);
		
		itemCopy = new JMenuItem("Copier");
		itemCut = new JMenuItem("Couper");
		itemPaste = new JMenuItem("Coller");
		
		JCBMediteur = new JCheckBoxMenuItem("Editeur",true);
		JCBMexecution = new JCheckBoxMenuItem("Execution",true);
		JCBMconsole = new JCheckBoxMenuItem("Console",true);
		JCBMediteur.addActionListener(this);
		JCBMexecution.addActionListener(this);
		JCBMconsole.addActionListener(this);
		
		itemInfo = new JMenuItem("Qu'est ce que le LOGO ?");	    
		itemVersion = new JMenuItem("Version");
		itemInfo.addActionListener(this);
		itemVersion.addActionListener(this);
		
		this.setJMenuBar(menuBar);	    
		menuBar.add(menuFichier);
		menuBar.add(menuEdition);
		menuBar.add(menuAffichage);
		menuBar.add(menuAide);	       	    
		menuFichier.add(itemNouveau);
		menuFichier.addSeparator();
		menuFichier.add(itemOpen);
		menuFichier.add(itemSave);
		menuFichier.add(itemSaveAs);
		menuFichier.addSeparator();
		//menuFichier.add(itemExit);
		menuEdition.add(itemCopy);
		menuEdition.add(itemCut);
		menuEdition.add(itemPaste);
		menuAffichage.add(JCBMediteur);
		menuAffichage.add(JCBMexecution);
		menuAffichage.add(JCBMconsole);
		menuAide.add(itemInfo);
		menuAide.add(itemVersion);	   		
	}
	
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == JCBMediteur) {JIFedit.setVisible(!JIFedit.isVisible());}
		if (e.getSource() == JCBMexecution) {JIFexec.setVisible(!JIFexec.isVisible());}
		if (e.getSource() == JCBMconsole) {JIFconsol.setVisible(!JIFconsol.isVisible());}
		if (e.getSource() == itemNouveau) 
		{
			if (edit.isModif())
			{
				int retour = 
				JOptionPane.showConfirmDialog(this,
			              "Enregistrer les modifications du fichier avant de le fermer ?",
			              "Nouveau fichier",
			              JOptionPane.YES_NO_CANCEL_OPTION);
				if (retour==JOptionPane.OK_OPTION)
					{this.enregistrer();this.nouveau();}
				else if (retour==JOptionPane.NO_OPTION)
					{this.nouveau();}
			}			
		}
		if (e.getSource() == itemOpen) {this.ouvrir();} //edit.lecture("aParser.txt");
		if (e.getSource() == itemSaveAs) {this.enregistrerSous();}
		if (e.getSource() == itemSave) {this.enregistrer();}
		if (e.getSource() == itemVersion) 
		{
			JOptionPane.showMessageDialog(this,"Interpreteur LOGO : version 0.1 \n\n" +
					"Auteurs : \n" +
					"\t - Delfour Kevin \n" +
					"\t - Allier Simon \n" +
					"\t - Lalluque Renaud \n" +
					"\t - Grollemund Naitan \n",
					"Interpreteur Logo",
					JOptionPane.INFORMATION_MESSAGE);
		}
		if (e.getSource() == itemInfo)
		{			
			URL recup;
			try {
				recup = new URL(getDocumentBase(), "http://lwh.free.fr/pages/prog/logo/Logo.pdf");
				this.getAppletContext().showDocument(recup, "_blank");
			} catch (MalformedURLException netException) {
				JOptionPane.showMessageDialog(this,
						"Impossible d'acceder � la documentation, verifier votre acc�s internet",
						"Erreur",
						JOptionPane.ERROR_MESSAGE);													
			}		
		}				
	}
	
	
	File currentPath = (new JFileChooser()).getCurrentDirectory(); //new File(System.getProperty("user.dir"));
	String currentFile;
	FiltreFichier FFLogo = new FiltreFichier( new String[]{"logo"},"Document Logo (*.logo)");
	FiltreFichier FFText = new FiltreFichier( new String[]{"txt"},"Document texte (*.txt)"); 
	
	public void ouvrir()
	{
		JFileChooser choix = new JFileChooser();
		choix.setCurrentDirectory(currentPath);		
		choix.addChoosableFileFilter(FFText);
		choix.addChoosableFileFilter(FFLogo);
		int retour = choix.showOpenDialog(getParent());
		if(retour == JFileChooser.APPROVE_OPTION) {			
			currentFile = choix.getSelectedFile().getAbsolutePath(); 
			currentPath = choix.getSelectedFile().getAbsoluteFile();			
			JIFedit.setTitle(TitreEditeur+" - "+choix.getSelectedFile().getName());
			edit.lecture(currentFile); //ouverture du fichier
			edit.setModif(false); //on reinitialise l'indicice de modification
			consol.out("Ouverture du fichier : "+currentFile);
		}
		else ;  	
	}
	public void enregistrerSous()
	{
		JFileChooser choix = new JFileChooser();
		choix.setCurrentDirectory(currentPath);
		choix.addChoosableFileFilter(FFText);
		choix.addChoosableFileFilter(FFLogo);
		int retour = choix.showSaveDialog(getParent());
		if(retour == JFileChooser.APPROVE_OPTION) {			
			currentFile = choix.getSelectedFile().getAbsolutePath(); //sauvegarde du fichier
			currentPath = choix.getSelectedFile().getAbsoluteFile();
			choix.setCurrentDirectory(currentPath.getParentFile());
			JIFedit.setTitle(TitreEditeur+" - "+choix.getSelectedFile().getName());
			edit.ecrire(currentFile);
			edit.setModif(false); //on reinitialise l'indicice de modification
			consol.out("Fichier enregistr� : "+currentFile);
		}
		else ;
	}
	
	public void enregistrer()	
	{
		if (saved) 
		{
			edit.ecrire(currentFile);
			if (edit.isModif())
			{
				JIFedit.setTitle(JIFedit.getTitle().substring(0,JIFedit.getTitle().length()-1));
				consol.out("Fichier enregistr� : "+currentFile);
			}
		}
		else {this.enregistrerSous();saved=true;}		
	}
	
	public void nouveau()
	{
		edit.nouveau();
		JIFedit.setTitle(TitreEditeur+"- Nouveau fichier");
		edit.setModif(false);
		consol.out("Creation d'un nouveau fichier");
	}
}

